--
-- Nueva formula de calculo de contenido del QR 
--

DROP FUNCTION afip.codigoqr_facturaelectronica(integer);

CREATE OR REPLACE FUNCTION afip.codigoqr_facturaelectronica(
	integer)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
pIdComm		ALIAS FOR $1;
vJSON		varchar;
vCadena		varchar;
vCadena64	varchar;
vIdPadFiscal	integer;
vLetra		varchar;
--
vafip_url	varchar;
vafip_urlprm	varchar;
vversion	varchar;
vfecha		varchar;
vcuitEmisor	varchar;
vptoVta		varchar;
vtipoCmp	varchar;
vnroCmp		varchar;
vImporteMoneda	varchar;
vmoneda		varchar;
vctz		varchar;
vtipoDocRec	varchar;
vnroDocRec	varchar;
vtipoCodAut	varchar;
vcodAut		varchar;
vCD         varchar;

BEGIN
-- URL = https://www.afip.gob.ar/fe/qr/
-- <DATOS_CMP_BASE_64> = JSON con datos del comprobante en Base64
-- =====================
-- Datos del comprobante
-- version del formato de los datos del comprobante	(1 digito)	(obligatorio)
-- C.U.I.T. del emisor de la factura (11 caracteres)	(11 digitos)	(obligatorio)
-- punto de venta					(hta 5 digitos)	(obligatorio)
-- tipo comprobante afip 				(hta 3 digitos)	(obligatorio)
-- nro comprobante					(hta 8 digitos)	(obligatorio)
-- total en la moneda informada 			(hta 13 enteros y 2 decimales) 	(obligatorio)
-- moneda						(3 caracteres) (obligatorio)
-- cotizacion moneda					(hta 13 enteros y 6 decimales)	(obligatorio)
-- tipo documento receptor				(hta 2 digitos)  (de corresponder)
-- nro. documento receptor				(hta 20 digitos) (de corresponder)
-- codigo del Tipo de Autorizacion			(string): E para comprobante autorizado por CAE	(obligatorio)
-- nro CAE						(14 digitos)	(obligatorio)
-- =====================
SELECT TO_CHAR(comm.fecha, 'YYYY-MM-DD'), 
       comm.nroptovta, comm.afipcbtetipo, comm.nro,
       ROUND(comm.total/comm.afipfemonctz, 2),
       comm.afipfemoncod, TO_CHAR(comm.afipfemonctz, 'FM9999999999999.009999'),
       comm.codcai,
       paddoc.coddgi, str_solo_digitos(comm.cuitfiscal), comm.idpadfiscal, comm.letra,
       (select str_solo_digitos(ambemp.cuit) 
	   from ambemp
	   inner join ambempsuc on ambemp.cod = ambempsuc.codambemp
	   where comm.codambsuc = ambempsuc.codambsuc limit 1) 
INTO vfecha, 
     vptoVta, vtipoCmp, vnroCmp, 
     vImporteMoneda, vMoneda, vctz, 
     vcodAut,
     vTipoDocRec, vNroDocRec, vidPadfiscal, vLetra,
     vCuitEmisor
 FROM comm
      JOIN ambempsuc ON comm.codambsuc = ambempsuc.codambsuc
      JOIN ambemp ON ambempsuc.codambemp = ambemp.cod
      LEFT JOIN paddoc ON comm.tipocuitfiscal = paddoc.tipo  
 WHERE comm.id = pIdComm
 LIMIT 1; 

-- Tipo y Nro doc. receptor
-- Si los fiscales no estan, si no es comprobante  A , puede ser TipoDoc
IF (vTipoDocRec IS NULL) AND (vLetra <> 'A') THEN
  SELECT COALESCE(paddoc.coddgi, '99'), str_solo_digitos(pad.nrodoc) 
  INTO vTipoDocRec, vNroDocRec
  FROM pad JOIN paddoc ON pad.tipocuit = paddoc.tipo WHERE pad.id = vidPadFiscal;

  -- si paddoc.coddgi = NULL o 99 ('otro') no informar (no estoy segura de esto..)
  IF (vTipoDocRec = '99') THEN    
    vTipoDocRec := NULL;
    vNroDocRec  := NULL;
  END IF;
END IF;

vCD := chr(34); --comillas dobles

--Ejemplo JSON (la cadena va entre llaves)
--  ver :1, fecha : 2020-10-13 , cuit :30000000007, ptoVta :10, tipoCmp :1, nroCmp :94, importe :12100, moneda : DOL , ctz :65, tipoDocRec :80, nroDocRec :20000000001, tipoCodAut : E , codAut :70417054367476>
vVersion	:= vCD || 'ver' || vCD || ':1';
vFecha		:= ',' || vCD || 'fecha' || vCD || ':' || vCD || vfecha || vCD; 
vCuitEmisor	:= ',' || vCD || 'cuit'  || vCD || ':' || vCuitEmisor; 
vPtoVta		:= ',' || vCD || 'ptoVta'  || vCD || ':' || vPtoVta; 
vTipoCmp	:= ',' || vCD || 'tipoCmp' || vCD || ':' || vTipoCmp; 
vNroCmp		:= ',' || vCD || 'nroCmp'  || vCD || ':' || vNroCmp; 
vImporteMoneda	:= ',' || vCD || 'importe' || vCD || ':' || vImporteMoneda; 
vMoneda		:= ',' || vCD || 'moneda' || vCD || ':' || vCD ||vMoneda || vCD; 
vCtz		:= ',' || vCD || 'ctz' || vCD || ':' || vCtz; 
vTipoDocRec	:= COALESCE(',' || vCD || 'tipoDocRec' || vCD || ':' || vTipoDocRec, '');	--informar de corresponder
vNroDocRec	:= COALESCE(',' || vCD || 'nroDocRec' || vCD || ':' || vNroDocRec, '');		--informar de corresponder
vTipoCodAut	:= ',' || vCD || 'tipoCodAut' || vCD || ':' || vCD || 'E' || vCD || ''; 
vCodAut		:= ',' || vCD || 'codAut' || vCD || ':' || vCodAut; 

--chr(123) = llave abre
--chr(125) = llave cierra
vJSON := chr(123) || vVersion|| vFecha || vCuitEmisor || vPtoVta || vTipoCmp || vNroCmp 
	          || vImporteMoneda || vMoneda || vCtz
		  || vTipoDocRec || vNroDocRec
		  || vTipoCodAut || vCodAut 
		  || chr(125);
             
--pasar JSON a Base64 (encode(data bytea, format text))
vCadena64 := (SELECT encode(CAST(vJSON AS bytea), 'base64'));

--vafip_url := 'https://www.afip.gob.ar/fe/qr/';
vafip_url := 'https://serviciosweb.afip.gob.ar/genericos/comprobantes/cae.aspx';
--chr(63) = signo pregunta
vafip_urlprm := chr(63)||'p=';

-- valor a codificar como codigo QR
RETURN (vafip_url || vafip_urlprm || replace(replace(vCadena64,chr(10),''),chr(13),''));
END;
$BODY$;

ALTER FUNCTION afip.codigoqr_facturaelectronica(integer)
    OWNER TO abacouser;


--
SELECT aaversion('495.01','495.00');
--

